package edu.hunau.cxb18.spring.annotation.advice;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * @author hb
 * @create 2020-03-17 11:10
 */
@Component  //配置为一个spring的普通组件
@Aspect  //表明该类为一个切面类
@Order(2) //指定切面执行的顺序，数字越小优先级越高
public class MyAnnotationAdvice {

    /**
     * 定义一个空的方法，通过@Pointcut定义一个切入点
     * 如果需要使用该切入点通过该方法名直接引入即可（实现切入点的复用）
     */
    @Pointcut("execution(* edu.hunau.cxb18.spring.annotation.service.*.*(..))")
    public void pointCut01(){  }


    @Before(value = "pointCut01()")
    public void before(JoinPoint j){
        System.out.println("\t【MyAnnotationAdvice#前置通知】:目标方法：" + j.getSignature().getName());
    }

    @AfterReturning(value="pointCut01()",returning = "result")
    public void afterReturning(JoinPoint  j,Object result){
        System.out.println("\t【返回通知】:目标方法：" + j.getSignature().getName() + ",返回结果:" + result);
    }

    @Pointcut("execution(* add*(..))")
    public void pointCut02(){  }

    @AfterThrowing(value="pointCut02()",throwing = "e")
    public void hasException(JoinPoint j,Exception e){
        System.out.println("\t【异常通知】:目标方法：" + j.getSignature().getName() + ",异常信息:" + e.getMessage());
    }
}
